// @see https://github.com/bcherny/json-schema-to-typescript/issues/228
export const input = {
  $schema: 'http://json-schema.org/draft-07/schema#',
  $id: 'http://json-schema.org/draft-07/schema#',
  title: 'Core schema meta-schema',
  definitions: {
    schemaArray: {
      type: 'array',
      minItems: 1,
      items: {$ref: '#'},
    },
    nonNegativeInteger: {
      type: 'integer',
      minimum: 0,
    },
    nonNegativeIntegerDefault0: {
      allOf: [{$ref: '#/definitions/nonNegativeInteger'}, {default: 0}],
    },
    simpleTypes: {
      enum: ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'],
    },
    stringArray: {
      type: 'array',
      items: {type: 'string'},
      uniqueItems: true,
      default: [],
    },
  },
  type: ['object', 'boolean'],
  properties: {
    $id: {
      type: 'string',
      format: 'uri-reference',
    },
    $schema: {
      type: 'string',
      format: 'uri',
    },
    $ref: {
      type: 'string',
      format: 'uri-reference',
    },
    $comment: {
      type: 'string',
    },
    title: {
      type: 'string',
    },
    description: {
      type: 'string',
    },
    default: true,
    readOnly: {
      type: 'boolean',
      default: false,
    },
    writeOnly: {
      type: 'boolean',
      default: false,
    },
    examples: {
      type: 'array',
      items: true,
    },
    multipleOf: {
      type: 'number',
      exclusiveMinimum: 0,
    },
    maximum: {
      type: 'number',
    },
    exclusiveMaximum: {
      type: 'number',
    },
    minimum: {
      type: 'number',
    },
    exclusiveMinimum: {
      type: 'number',
    },
    maxLength: {$ref: '#/definitions/nonNegativeInteger'},
    minLength: {$ref: '#/definitions/nonNegativeIntegerDefault0'},
    pattern: {
      type: 'string',
      format: 'regex',
    },
    additionalItems: {$ref: '#'},
    items: {
      anyOf: [{$ref: '#'}, {$ref: '#/definitions/schemaArray'}],
      default: true,
    },
    maxItems: {$ref: '#/definitions/nonNegativeInteger'},
    minItems: {$ref: '#/definitions/nonNegativeIntegerDefault0'},
    uniqueItems: {
      type: 'boolean',
      default: false,
    },
    contains: {$ref: '#'},
    maxProperties: {$ref: '#/definitions/nonNegativeInteger'},
    minProperties: {$ref: '#/definitions/nonNegativeIntegerDefault0'},
    required: {$ref: '#/definitions/stringArray'},
    additionalProperties: {$ref: '#'},
    definitions: {
      type: 'object',
      additionalProperties: {$ref: '#'},
      default: {},
    },
    properties: {
      type: 'object',
      additionalProperties: {$ref: '#'},
      default: {},
    },
    patternProperties: {
      type: 'object',
      additionalProperties: {$ref: '#'},
      propertyNames: {format: 'regex'},
      default: {},
    },
    dependencies: {
      type: 'object',
      additionalProperties: {
        anyOf: [{$ref: '#'}, {$ref: '#/definitions/stringArray'}],
      },
    },
    propertyNames: {$ref: '#'},
    const: true,
    enum: {
      type: 'array',
      items: true,
      minItems: 1,
      uniqueItems: true,
    },
    type: {
      anyOf: [
        {$ref: '#/definitions/simpleTypes'},
        {
          type: 'array',
          items: {$ref: '#/definitions/simpleTypes'},
          minItems: 1,
          uniqueItems: true,
        },
      ],
    },
    format: {type: 'string'},
    contentMediaType: {type: 'string'},
    contentEncoding: {type: 'string'},
    if: {$ref: '#'},
    then: {$ref: '#'},
    else: {$ref: '#'},
    allOf: {$ref: '#/definitions/schemaArray'},
    anyOf: {$ref: '#/definitions/schemaArray'},
    oneOf: {$ref: '#/definitions/schemaArray'},
    not: {$ref: '#'},
  },
  default: true,
}
